﻿using System;
using System.Collections.Specialized;
using System.Web;
using APILocawebGatewayUI.Nucleo;

namespace APILocawebGatewayUI.REDECARD
{
    public class GerenciadorRedecard
    {
        public event ReenviadoHandler Reenviado;

        private readonly HttpContext _context;

        public GerenciadorRedecard(HttpContext context)
        {
            _context = context;
        }

        /// <summary>
        /// Código de serviço de Comércio Eletrônico junto à Locaweb.
        /// </summary>
        internal string Identificacao
        {
            get { return APILocawebConfiguration.Instancia.Identificacao; }
        }

        /// <summary>
        /// Define o tipo de ambiente (teste ou producao).
        /// </summary>
        internal string Ambiente
        {
            get { return APILocawebConfiguration.Instancia.Redecard.Ambiente; }
        }

        /// <summary>
        /// Código de afiliação junto a redecard.
        /// </summary>
        internal string Filiacao
        {
            get { return APILocawebConfiguration.Instancia.Redecard.Filiacao; }
        }

        private string _status;
        /// <summary>
        /// Código de retorno.
        /// </summary>
        public string Status
        {
            get
            {
                if (string.IsNullOrEmpty(_status))
                {
                    if (String.IsNullOrEmpty(_context.Request["CODRET"]))
                        _status = "0";
                    else
                        _status = _context.Request["CODRET"];
                }
                return _status;
            }
            private set { _status = value; }
        }

        /// <summary>
        /// Retorna se a transação foi aprovada ou não.
        /// </summary>
        public bool EstaAprovada
        {
            get { return Convert.ToInt32(this.Status) >= 0 && Convert.ToInt32(this.Status) <= 49; }
        }

        /// <summary>
        /// Mensagem de retorno.
        /// </summary>
        public string MensagemRetornoTransacao
        {
            get { return _context.Request["MSGRET"]; }
        }

        /// <summary>
        /// Data da transação
        /// </summary>
        public string DataTransacao
        {
            get { return _context.Request["DATA"]; }
        }

        /// <summary>
        /// Número de autorização
        /// </summary>
        public string NumeroAutorizacao
        {
            get { return _context.Request["NUMAUTOR"]; }
        }

        /// <summary>
        /// Número seqüencial único.
        /// </summary>
        public string NumeroSequencialUnico
        {
            get { return _context.Request["NUMSQN"]; }
        }

        /// <summary>
        /// Número Comprovante de venda.
        /// </summary>
        public string NumeroComprovanteVenda
        {
            get { return _context.Request["NUMCV"]; }
        }

        /// <summary>
        /// Número de autenticação.
        /// </summary>
        public string NumeroAutenticacao
        {
            get { return _context.Request["NUMAUTENT"]; }
        }

        /// <summary>
        /// Número do pedido.
        /// </summary>
        public string NumeroPedido
        {
            get { return _context.Request["NUMPEDIDO"]; }
        }

        /// <summary>
        /// Número do cartão utilizado na transação mascarado.
        /// </summary>
        public string NumeroCartao
        {
            get { return _context.Request["NR_CARTAO"]; }
        }

        /// <summary>
        /// Código de Nacionalidade do Emissor
        /// </summary>
        public string CodNacionalidadeEmissor
        {
            get { return _context.Request["ORIGEM_BIN"]; }
        }


        /// <summary>
        /// Campo livre
        /// </summary>
        internal string CampoLivre
        {
            get { return _context.Request["PAX1"]; }
        }

        /// <summary>
        /// Data de expiração da transação. Retornado apenas em transações de Pré-Autorização aprovadas.
        /// </summary>
        public string DataExpiracaoTransacao
        {
            get { return _context.Request["DATA_EXPI"]; }
        }


        /// <summary>
        /// Código de retorno AVS
        /// </summary>
        public string CodigoRetornoAVS
        {
            get { return _context.Request["RESPAVS"]; }
        }

        /// <summary>
        /// Mensagem de retorno AVS
        /// </summary>
        public string MensagemRetornoAVS
        {
            get { return _context.Request["MSGAVS"]; }
        }


        /// <summary>
        /// Este método realiza a requisição de captura e retorna uma string com o código de resposta
        /// </summary>
        public bool RealizarCaptura()
        {
            if (this.Status == "0")
            {
                var valorQueryString = this.CampoLivre;
                String quantidadeParcelasAsString = RedecardUtilidades.PesquisarQueryString(valorQueryString, "P");

                for (int i = quantidadeParcelasAsString.Length; quantidadeParcelasAsString.Length < 2; i++)
                    quantidadeParcelasAsString = "0" + quantidadeParcelasAsString;

                NameValueCollection queryStringCaptura = new NameValueCollection
                                                             {
                                                                 {"DATA", this.DataTransacao},
                                                                 {"TRANSACAO", "203"},
                                                                 {"TRANSORIG", RedecardUtilidades.PesquisarQueryString(valorQueryString,"O")},
                                                                 {"PARCELAS", quantidadeParcelasAsString},
                                                                 {"FILIACAO", this.Filiacao},
                                                                 {"TOTAL", RedecardUtilidades.FormataMoedaParaConfirmacao(Convert.ToDecimal(RedecardUtilidades.PesquisarQueryString(valorQueryString,"V")))},
                                                                 {"NUMPEDIDO", this.NumeroPedido},
                                                                 {"NUMAUTOR", this.NumeroAutorizacao},
                                                                 {"NUMCV", this.NumeroComprovanteVenda},
                                                                 {"NUMSQN", this.NumeroSequencialUnico}
                                                             };
                Utilidades.Debugar(FormasDePagamento.REDECARD, "QueryString:" + Utilidades.GerarQueryString(queryStringCaptura), this);

                if (Reenviado != null)
                {
                    Reenviado(this, new ReenviadoArgs(this.NumeroPedido));
                }

                var valor = Utilidades.RequisicaoGET("http://ecommerce.redecard.com.br/pos_virtual/confirma.asp", queryStringCaptura);
                this.Status = Utilidades.PesquisarQueryString(valor, "CODRET");
                return this.EstaAprovada;
            }
            return false;
        }

        /// <summary>
        /// Este método realiza a requisição de captura e retorna uma string com o código de resposta
        /// </summary>
        /// <returns></returns>
        public string UrlDoComprovante(IdiomaDoSite idiomaDoSite, bool javascript)
        {
            string idioma;
            switch (idiomaDoSite)
            {
                case IdiomaDoSite.Espanhol:
                    idioma = "S";
                    break;
                case IdiomaDoSite.Ingles:
                    idioma = "E";
                    break;
                default:
                    idioma = "";
                    break;
            }

            string url = "https://ecommerce.redecard.com.br/pos_virtual/cupom.asp?DATA=" + this.DataTransacao +
                         "&TRANSACAO=201&NUMAUTOR=" + this.NumeroAutorizacao + "&NUMCV=" + this.NumeroComprovanteVenda +
                         idioma;
            if (javascript)
                return "javascript:window.open('" + url +
                       "','vpos','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=auto,resizable=no,copyhistory=no,width=600,height=460'); void(0);";

            return url;
        }

    }
}